package cn.tedu.imop.api.service;

import cn.tedu.imop.api.domain.Attach;
import cn.tedu.imop.api.model.RestResult;
import cn.tedu.imop.api.model.RestResultUtils;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * 基于@FeignClient注解描述的接口
 * 当启动类上添加了@EnableFeignClients注解描述，并指定包的扫描范围，
 * 此时会自动为使用了@FeignClient注解描述的接口创建JDK代理对象,并交给spring管理，这个
 * 代理对象名字会默认与会@FeignClient中name属性的值相同，帮我们执行执行远程服务调用。
 */

@FeignClient(name="imop-attach",
        contextId = "attachRemoteService",
        fallbackFactory = AttachFallbackFactory.class)//这里的名字是这个API要调用的服务名(nacos中可见)
public interface AttachRemoteService {//contextId表示给接口起一个Bean的名字
    @PutMapping(value="/v1/attach/binding")
    //Retry表示接口调用超时，可以重试,重试几次后会调用fallbackMethod指定的方法
    //假如没有指定fallbackMethod方法，会调用fallbackFactory中对象的create()方法
    @Retry(name = "attachRemoteService", fallbackMethod = "batchUpdateBusinessFallback")
    //@CircuitBreaker(name = "attachRemoteService", fallbackMethod = "batchUpdateBusinessFallback")
    RestResult batchUpdateBusiness(@RequestBody ArrayList<Attach> params);

    default RestResult batchUpdateBusinessFallback( ArrayList<Attach> params,Throwable e){
        throw new RuntimeException("default 方法 服务器忙,请稍后重试");
    };
}
